import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import ar.fi.uba.celdas.interfaces.ambiente.IAccion;
import ar.fi.uba.celdas.interfaces.ambiente.IInfoRobot;
import ar.fi.uba.celdas.interfaces.bc.IBaseConocimientos;
import ar.fi.uba.celdas.interfaces.bc.Regla;
import ar.fi.uba.celdas.interfaces.bc.Sensor;
import ar.fi.uba.celdas.interfaces.planificacion.IPlanificacion;
import ar.fi.uba.celdas.interfaces.ponderador.IPonderador;


public class BaseDeConocimiento implements IBaseConocimientos {
	
	List<Regla> reglas = new ArrayList<Regla>();
	Collection<Sensor> estadoAnterior = new ArrayList<Sensor>();
	
	static final String SENSOR_NORTE	= "NORTE";
	static final String SENSOR_SUR		= "SUR";
	static final String SENSOR_ESTE		= "ESTE";
	static final String SENSOR_OESTE	= "OESTE";
	
	public BaseDeConocimiento() {
		
	}
	
	static private BaseDeConocimiento getBase() {
		BaseDeConocimiento bc = new BaseDeConocimiento();
		
		Regla regla1 = new Regla();
		
		Sensor sNorte = new Sensor(SENSOR_NORTE,4);
		Sensor sEste = new Sensor(SENSOR_ESTE,2);
		Sensor sOeste = new Sensor(SENSOR_OESTE,0);
		Sensor sSur = new Sensor(SENSOR_SUR,2);
		
		Collection<Sensor> condiciones = regla1.getCondiciones();
		condiciones.add(sNorte);
		condiciones.add(sEste);
		
		regla1.setUso(10);
		regla1.setExitos(6);
		
		bc.reglas.add(regla1);
		
		bc.estadoAnterior.add(sNorte);
		bc.estadoAnterior.add(sEste);
		bc.estadoAnterior.add(sSur);
		bc.estadoAnterior.add(sOeste);
		
		return bc;
	}
	
	static BaseDeConocimiento getBaseInusualidad() {
		return getBase();
	}
	
	static BaseDeConocimiento getBaseIgnorancia() {
		BaseDeConocimiento bc = getBase();
		
		Regla regla2 = new Regla();
		
		Sensor sNorte = new Sensor(SENSOR_NORTE,2);
		Sensor sSur = new Sensor(SENSOR_SUR,2);
		Sensor sOeste = new Sensor(SENSOR_OESTE,4);
		
		Collection<Sensor> condiciones = regla2.getCondiciones();
		condiciones.add(sNorte);
		condiciones.add(sSur);
		condiciones.add(sOeste);
		
		regla2.setUso(5);
		regla2.setExitos(1);
		
		bc.reglas.add(regla2);
		
		return bc;
	}
	
	static BaseDeConocimiento getBaseCulpabilidad() {
		BaseDeConocimiento bc = getBase();
		
		Regla regla2 = new Regla();
		
		Sensor sNorte = new Sensor(SENSOR_NORTE,2);
		Sensor sSur = new Sensor(SENSOR_SUR,2);
		Sensor sOeste = new Sensor(SENSOR_OESTE,0);
		
		Collection<Sensor> condiciones = regla2.getCondiciones();
		condiciones.add(sNorte);
		condiciones.add(sSur);
		condiciones.add(sOeste);
		
		regla2.setUso(5);
		regla2.setExitos(2);
		
		Regla regla3 = new Regla();
		
		Collection<Sensor> condicionesR3 = regla3.getCondiciones();
		condicionesR3.add(sNorte);
		condicionesR3.add(sOeste);
		
		regla3.setUso(5);
		regla3.setExitos(4);
		
		bc.reglas.add(regla2);
		bc.reglas.add(regla3);
		
		return bc;
	}
	
	Regla getReglaACorregirInusualidad() {
		return reglas.get(0);
	}
	
	Regla getReglaACorregirIgnorancia() {
		return reglas.get(0);
	}
	
	Regla getReglaACorregirCulpabilidad() {
		return reglas.get(0);
	}

	@Override
	public List<Regla> getReglas() {
		return reglas;
	}

	@Override
	public Collection<Sensor> getObjetivo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Collection<Sensor> getEstadoAnterior() {
		return estadoAnterior;
	}

	@Override
	public Collection<Sensor> getEstadoActual() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Collection<IAccion> getAccionesDisponibles() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<IAccion> procesarSiguientesAcciones(IInfoRobot infoRobot) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int getMaxValor(Sensor sensor) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int getMinValor(Sensor sensor) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public Collection<Sensor> getEstadosConocidos() {
		return null;
	}
	
	public String toString() {
		String bc;
		
		bc = "BASE DE CONOCIMIENTOS\n";
		bc += "---- -- -------------\n\n";
		
		bc += "\nESTADO ANTERIOR:\n";
		for (Sensor sensor : estadoAnterior) {
			bc += sensor + "; ";
		}
		
		bc += "\nREGLAS:\n";
		int i = 0;
		for (Regla regla : reglas) {
			bc += "Regla " + i++ + "\n";
			bc += regla + "\n";
		}
		
		
		
		
		return bc;
	}

	@Override
	public void setPlanificador(IPlanificacion planificador) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void setPonderador(IPonderador ponderador) {
		// TODO Auto-generated method stub
		
	}

}
